package customer

import (
	"fmt"
	"go.uber.org/zap"
	"os"
	"server/global"
	CustomerModel "server/model/customer"
	customerReq "server/model/customer/request"
	customerRes "server/model/customer/response"
	"server/pkg/S3"
)

// AddOrUpdateFile 添加/更新客户文件
func (cs *CustomerService) AddOrUpdateFile(file customerReq.CustomerFile) (*customerRes.CustomerFileResult, string, error) {
	var customerFileModel CustomerModel.CustomerFileModel
	var customerFileResult customerRes.CustomerFileResult
	var action string

	if file.ID == 0 {
		action = "添加"
		// 创建新的 customerFileModel 对象
		customerFileModel = CustomerModel.CustomerFileModel{
			CustomerID: file.CustomerId,
			Name:       file.FileInfo.File.Name,
			Size:       file.FileInfo.File.Size,
			Key:        file.FileInfo.Key,
			Desc:       file.FileDesc,
		}

		// 执行添加操作
		if err := global.TD27_DB.Create(&customerFileModel).Error; err != nil {
			return nil, action, err
		}
	} else {
		action = "修改"
		// 根据 event.ID 查询对应的 customerEventModel 对象
		if err := global.TD27_DB.First(&customerFileModel, file.ID).Error; err != nil {
			global.TD27_LOG.Error("编辑客户文件 -> 查询Id", zap.Error(err))
			return nil, action, err
		}

		// 更新 customerFileModel 对象的属性值(只修改客户id和文件描述，其他不会变，如要改变其他属性，直接删除后新增即可)
		customerFileModel.CustomerID = file.CustomerId
		customerFileModel.Desc = file.FileDesc

		// 执行修改操作
		if err := global.TD27_DB.Save(&customerFileModel).Error; err != nil {
			global.TD27_LOG.Error("编辑客户文件 -> update", zap.Error(err))
			return nil, action, err
		}
	}

	// 构造返回结果
	customerFileResult.ID = customerFileModel.ID
	customerFileResult.CustomerId = customerFileModel.CustomerID
	customerFileResult.Name = customerFileModel.Name
	customerFileResult.Size = customerFileModel.Size
	customerFileResult.Desc = customerFileModel.Desc
	customerFileResult.Key = customerFileModel.Key

	return &customerFileResult, action, nil
}

// GetCustomerFile 获取客户文件
func (cs *CustomerService) GetCustomerFile(FileSp customerReq.FileSearchParams) ([]customerRes.CustomerFileResult, int64, error) {
	var fileResults []customerRes.CustomerFileResult
	var total int64

	db := global.TD27_DB.Model(&CustomerModel.CustomerFileModel{}).
		Select("customer_file.*, customer.id AS CustomerID,customer.name AS CustomerName").
		Joins("JOIN customer ON customer_file.customer_id = customer.id").
		Order("customer_file.updated_at DESC")

	if FileSp.CustomerName != "" {
		db = db.Where("customer.name LIKE ?", "%"+FileSp.CustomerName+"%")
	}

	if FileSp.FileKeyword != "" {
		db = db.Where("customer_file.name LIKE ?", "%"+FileSp.FileKeyword+"%")
	}

	if FileSp.CustomerID != 0 {
		db = db.Where("customer.id = ?", FileSp.CustomerID)
	}

	err := db.Count(&total).Error
	if err != nil {
		return fileResults, total, fmt.Errorf("查询 CustomerFileModel 失败: %v", err)
	}
	if FileSp.PageSize != 0 && FileSp.Page != 0 {
		db.Limit(FileSp.PageSize).Offset(FileSp.PageSize * (FileSp.Page - 1))
	}
	db.Find(&fileResults)
	// 返回结果
	return fileResults, total, nil
}

// DeleteCustomerFile  删除客户文件
func (cs *CustomerService) DeleteCustomerFile(id int, key string) (msg map[string]string, err error) {
	msg = map[string]string{
		"local":    "",
		"S3":       "",
		"DataBase": "",
		"message":  "",
	}

	// 定义本地文件的路径
	targetDir := global.TD27_CONFIG.System.LocalStoreDir + "file/" // 设置上传文件的存储路径
	localPath := targetDir + key
	var fileResults []customerRes.CustomerFileResult
	db := global.TD27_DB.Model(&CustomerModel.CustomerFileModel{}).
		Select("customer_file.*")

	// id为0，表示是其他方式删除的，不需要删除数据库记录。
	if id == 0 {
		err = db.Where("`key` = ?", key).Find(&fileResults).Error
		if err != nil {
			global.TD27_LOG.Error(fmt.Sprintf("执行SQL出错，error: %s", err))
			return
		}

		// 结果为0，表示没有其他记录依赖这个key的文件，可以删除。如果不为0，则不进行任何动作
		if len(fileResults) == 0 {
			// 删除本地文件
			err = os.Remove(localPath)
			if err != nil {
				msg["local"] = fmt.Sprintf("本地文件删除失败,error: %s", err)
			} else {
				msg["local"] = "删除成功！"
			}
			// 删除S3的文件
			m := S3.DeleteFileOnS3("file", key)
			msg["S3"] = m
		} else {
			msg["message"] = "此文件还有其他记录依赖，不执行删除操作"
		}
		return msg, nil
	} else {
		err = db.Where("`id` <> ?", id).
			Where("`key` = ?", key).
			Find(&fileResults).Error
		if err != nil {
			global.TD27_LOG.Error(fmt.Sprintf("执行SQL出错，error: %s", err))
			return
		}

		// 结果为0，表示没有其他记录依赖这个key的文件，可以删除文件；如果不为0，则只删除这个id的记录，不删除文件
		if len(fileResults) == 0 {
			// 删除本地文件
			err = os.Remove(localPath)
			if err != nil {
				msg["local"] = fmt.Sprintf("本地文件删除失败,error: %s", err)
			}
			// 删除S3的文件
			m := S3.DeleteFileOnS3("file", key)
			msg["S3"] = m
		} else {
			msg["message"] = "此文件还有其他记录依赖，不执行删除文件操作"
		}

		// 无论查询结果是否为空，都需要删除数据库中的记录
		err = global.TD27_DB.Where("id = ?", id).Unscoped().Delete(&CustomerModel.CustomerFileModel{}).Error
		if err != nil {
			msg["DataBase"] = fmt.Sprintf("DataBase中删除失败,error: %s", err)
		} else {
			msg["DataBase"] = "删除成功！"
		}
		return msg, nil
	}
}
